package com.image.compress;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Display;
import android.view.WindowManager;

/**
 * 图片压缩的工具类
 */

public class ImageCompressUtil {
    /**
     * 按手机分辨率压缩
     */
    public synchronized static void compress(Context context, String srcPath, String outPath, int quality) {
        Bitmap bitmap = compress(context, srcPath);
        if (bitmap == null) {
            return;
        }
        /**
         * 第一个参数传入一个将要压缩的图片
         * 第二个参数是压缩的程度，根据自己的需要来取值1-100
         * 第三个参数是图片压缩完成后输出的路径
         * 第三个参数是否采用哈弗曼算法,一般传true
         */
        ImageCompress.nativeCompressBitmap(bitmap, quality, outPath, true);
    }

    /**
     * 压缩Bitmap
     *
     * @param bitmap
     * @param outPath 输出的路径
     * @param quality 压缩比例1-100
     */
    public synchronized static void compress(Bitmap bitmap, String outPath, int quality) {
        ImageCompress.nativeCompressBitmap(bitmap, quality, outPath, true);
    }

    /**
     * 压缩图片
     */
    private static Bitmap compress(Context context, String imagePath) {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = wm.getDefaultDisplay();
        // 屏幕的宽高
        int screenWidth = display.getWidth();
        int screenHeight = display.getHeight();
        screenWidth = Math.max(screenWidth, 720);
        screenHeight = Math.max(screenHeight, 1080);
        return compress(imagePath, screenWidth, screenHeight);
    }

    /**
     * 根据宽高压缩
     */
    private static Bitmap compress(String imagePath, int width, int height) {
        BitmapFactory.Options opts = new BitmapFactory.Options();
        opts.inJustDecodeBounds = true;// 仅仅加载图片的头信息，不是真正加载图片
        // 不是真正加载图片
        BitmapFactory.decodeFile(imagePath, opts);
        // 图片的宽高
        int imgWidth = opts.outWidth;
        int imgHeight = opts.outHeight;
        int scale = 1;// 缩放的宽高
        // 计算绽放比例
        int dx = imgWidth / width;
        int dy = imgHeight / height;
        // 图片比屏幕大，需要缩放
        if (dy > 1 || dx > 1) {
            // 缩放比例取大的
            scale = dx > dy ? dx : dy;
        }
        opts.inSampleSize = scale;// 采样：如果是4  就去加载1/4 * 1/4 也就是原图的1/16的大小到内存
        opts.inJustDecodeBounds = false;// 真正加载图片
        Bitmap bitmap = BitmapFactory.decodeFile(imagePath, opts);
        return bitmap;
    }
}
